﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Model;
using System.Configuration;


namespace DAO
{
    public class FornecedorDAO
    {
        private SqlConnection connection = null;
        private static String sqlConn = ConfigurationManager.ConnectionStrings["ControlePedidoDB"].ToString();
        private static FornecedorDAO fornecedorDAO = null;

        private FornecedorDAO()
        {
            connection = new SqlConnection(sqlConn);
        }

        public static FornecedorDAO getInstance()
        {
            if (fornecedorDAO == null)
            {
                fornecedorDAO = new FornecedorDAO();
            }

            return fornecedorDAO;
        }

        public bool inserir(Fornecedor fornecedor)
        {
            bool validacao = false;
            String SQL_INSERT = "INSERT INTO Fornecedor " +
                                 "(nome, cnpj, endereco, " +
                                 "bairro, cidade, uf, " +
                                 "tel1, tel2, tel3) VALUES " +
                                 " ('" + fornecedor.Nome +
                                 "', '" + fornecedor.Cnpj +
                                 "', '" + fornecedor.Endereco +
                                 "', '" + fornecedor.Bairro +
                                 "', '" + fornecedor.Cidade +
                                 "', '" + fornecedor.Uf +
                                 "', '" + fornecedor.Tel1 +
                                 "', '" + fornecedor.Tel2 +
                                 "', '" + fornecedor.Tel3 + "')";
            SqlCommand command = null;

            try
            {
                //Abre a conexao com o BD
                connection.Open();

                //Cria comando SQL
                command = new SqlCommand(SQL_INSERT, connection);

                //Executa a query SQL
                command.ExecuteNonQuery();

                validacao = true;

            }
            catch (SqlException exception)
            {
                throw exception;
            }
            finally
            {
                connection.Close();
            }

            return validacao;
        }

        public bool alterar(Fornecedor fornecedor)
        {
            bool validacao = false;


            String SQL_UPDATE = "UPDATE Fornecedor SET" +
                                 " nome='" + fornecedor.Nome +
                                 "', cnpj='" + fornecedor.Cnpj +
                                 "', endereco='" + fornecedor.Endereco +
                                 "', bairro='" + fornecedor.Bairro +
                                 "', cidade='" + fornecedor.Cidade +
                                 "', uf='" + fornecedor.Uf +
                                 "', tel1='" + fornecedor.Tel1 +
                                 "', tel2='" + fornecedor.Tel2 +
                                 "', tel3='" + fornecedor.Tel3 +
                                 "' WHERE id_fornecedor='" + fornecedor.Codigo + "'";
            SqlCommand command = null;

            try
            {

                connection.Open();

                command = new SqlCommand(SQL_UPDATE, connection);

                command.ExecuteNonQuery();

                validacao = true;

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                connection.Close();
            }

            return validacao;
        }

        public bool cancelar(Fornecedor fornecedor)
        {
            bool validacao = false;
            String SQL_CANCEL = "DELETE FROM Fornecedor WHERE id_fornecedor=" + fornecedor.Codigo;

            SqlCommand command = null;

            try
            {
                connection.Open();

                command = new SqlCommand(SQL_CANCEL, connection);

                command.ExecuteNonQuery();

                validacao = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                connection.Close();
            }

            return validacao;

        }

        public Fornecedor consultar(Fornecedor fornecedorEntrada)
        {
            Fornecedor fornecedor = null;
            String SQL_CONSULTA = "SELECT * FROM Fornecedor " +
                                  "WHERE id_fornecedor = " + fornecedorEntrada.Codigo;
            SqlCommand commandPopula = null;
            SqlDataReader Reader = null;

            try
            {
                connection.Open();

                commandPopula = connection.CreateCommand();

                commandPopula.CommandText = SQL_CONSULTA;

                Reader = commandPopula.ExecuteReader();

                StringBuilder consulta = new StringBuilder();
                String[] resultadoBusca = null;

                while (Reader.Read())
                {
                    for (int i = 0; i < Reader.FieldCount; i++)
                    {
                        consulta.Append(Reader.GetValue(i).ToString() + '/');
                    }

                }

                resultadoBusca = consulta.ToString().Split('/');

                fornecedor = new Fornecedor();


                fornecedor.Codigo = fornecedorEntrada.Codigo;
                fornecedor.Nome = resultadoBusca[1];
                fornecedor.Cnpj = resultadoBusca[2];
                fornecedor.Endereco = resultadoBusca[3];
                fornecedor.Bairro = resultadoBusca[4];
                fornecedor.Cidade = resultadoBusca[5];
                fornecedor.Uf = resultadoBusca[6];
                fornecedor.Tel1 = resultadoBusca[7];
                fornecedor.Tel2 = resultadoBusca[8];
                fornecedor.Tel3 = resultadoBusca[9];

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                connection.Close();
                Reader.Close();
            }

            return fornecedor;
        }

        public List<Fornecedor> recuperarTodosFornecedores()
        {
            List<Fornecedor> fornecedores = null;
            String SQL_TODOS_FORNECEDORES = "SELECT id_fornecedor, nome FROM Fornecedor";
            SqlCommand comandoExecutar = null;
            SqlDataReader resultadoBusca = null;
            Fornecedor auxiliar = null;

            try
            {
                connection.Open();

                comandoExecutar = new SqlCommand(SQL_TODOS_FORNECEDORES, connection);

                resultadoBusca = comandoExecutar.ExecuteReader();

                fornecedores = new List<Fornecedor>();

                while (resultadoBusca.Read())
                {
                    auxiliar = new Fornecedor();

                    auxiliar.Codigo = Int32.Parse(resultadoBusca["id_fornecedor"].ToString());
                    auxiliar.Nome = resultadoBusca["nome"].ToString();

                    fornecedores.Add(auxiliar);
                }

            }
            catch (Exception cause)
            {
                Console.WriteLine("Erro na conexão com o BD - {0}", cause.Message);
            }
            finally
            {
                connection.Close();
            }

            return fornecedores;
        }

        public List<Fornecedor> recuperarFornecedores(Fornecedor fornecedor)
        {
            List<SqlParameter> parametros = new List<SqlParameter>();
            List<Fornecedor> fornecedoresRecuperados = new List<Fornecedor>();
            Fornecedor auxiliar = null;
            String SQL_BUSCA = "SELECT id_fornecedor, nome, cnpj FROM fornecedor WHERE ";
            SqlCommand comandoExecutar = null;
            SqlDataReader resultadoBusca = null;

            if (fornecedor.Codigo > 0)
            {
                SQL_BUSCA += "id_fornecedor = @id";

                parametros.Add(new SqlParameter("@id", fornecedor.Codigo));
            }

            if (fornecedor.Nome != null && !fornecedor.Nome.Equals(""))
            {

                if (SQL_BUSCA.Contains('@'))
                {
                    SQL_BUSCA += " AND ";
                }
                else
                {

                }
                SQL_BUSCA += "nome LIKE @nome";
                parametros.Add(new SqlParameter("@nome", "%" + fornecedor.Nome + "%"));
            }

            if (fornecedor.Cnpj != null && !fornecedor.Cnpj.Equals(""))
            {

                if (SQL_BUSCA.Contains('@'))
                {
                    SQL_BUSCA += " AND ";
                }
                else
                {

                }
                SQL_BUSCA += "cnpj = @cnpj";
                parametros.Add(new SqlParameter("@cnpj", fornecedor.Cnpj));
            }

            try
            {
                connection.Open();

                comandoExecutar = new SqlCommand(SQL_BUSCA, connection);

                foreach (var parametro in parametros)
                {
                    comandoExecutar.Parameters.Add(parametro);
                }

                resultadoBusca = comandoExecutar.ExecuteReader();

                while (resultadoBusca.Read())
                {
                    auxiliar = new Fornecedor();

                    auxiliar.Codigo = Int32.Parse(resultadoBusca["id_fornecedor"].ToString());
                    auxiliar.Nome = resultadoBusca["nome"].ToString();
                    auxiliar.Cnpj = resultadoBusca["cnpj"].ToString();

                    fornecedoresRecuperados.Add(auxiliar);
                }

            }
            catch (Exception cause)
            {
                throw new Exception("A busca não trouxe nenhum resultado - causa: " + cause.Message);
            }
            finally
            {
                connection.Close();
            }

            return fornecedoresRecuperados;
        }
    }
}